home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Enigma Amiga Life 109
/
EnigmaAmiga109CD.iso
/
dalla rivista
/
host contacted
/
jikes.lha
/
jikes-1.11
/
src
/
table.h
< prev
next >
Wrap
C/C++ Source or Header
|
1999-08-26
|
13KB
|
439 lines
// $Id: table.h,v 1.7 1999/08/26 15:34:10 shields Exp $
//
// This software is subject to the terms of the IBM Jikes Compiler
// License Agreement available at the following URL:
// http://www.ibm.com/research/jikes.
// Copyright (C) 1996, 1998, International Business Machines Corporation
// and others. All Rights Reserved.
// You must accept the terms of that agreement to use this software.
//
#ifndef table_INCLUDED
#define table_INCLUDED
#include "config.h"
#include "symbol.h"
class VariableShadowSymbol
{
public:
VariableSymbol *variable_symbol;
VariableShadowSymbol(VariableSymbol *variable_symbol_) : variable_symbol(variable_symbol_),
conflict(NULL)
{}
~VariableShadowSymbol()
{
delete conflict;
}
VariableSymbol *Conflict(int i) { return (*conflict)[i]; }
inline int NumConflicts()
{
return (conflict ? conflict -> Length() : 0);
}
inline void AddConflict(VariableSymbol *conflict_symbol)
{
if ((variable_symbol != conflict_symbol) && (! Find(conflict_symbol)))
conflict -> Next() = conflict_symbol;
return;
}
inline void CompressSpace()
{
if (conflict)
(void) conflict -> Array();
}
private:
friend class ExpandedFieldTable;
VariableShadowSymbol *next;
ConvertibleArray<VariableSymbol *> *conflict;
bool Find(VariableSymbol *conflict_symbol)
{
if (! conflict)
conflict = new ConvertibleArray<VariableSymbol *>(4);
for (int k = 0; k < conflict -> Length(); k++)
if ((*conflict)[k] == conflict_symbol)
return true;
return false;
}
};
class MethodShadowSymbol
{
public:
MethodSymbol *method_symbol;
MethodShadowSymbol *next_method;
MethodShadowSymbol(MethodSymbol *method_symbol_) : method_symbol(method_symbol_),
conflict(NULL)
{}
~MethodShadowSymbol()
{
delete conflict;
}
MethodSymbol *Conflict(const int i) { return (*conflict)[i]; }
inline int NumConflicts()
{
return (conflict ? conflict -> Length() : 0);
}
inline void AddConflict(MethodSymbol *conflict_symbol)
{
if ((method_symbol != conflict_symbol) && (! Find(conflict_symbol)))
conflict -> Next() = conflict_symbol;
return;
}
inline void RemoveConflicts()
{
delete conflict;
conflict = NULL;
}
inline void CompressSpace()
{
if (conflict)
(void) conflict -> Array();
}
private:
friend class ExpandedMethodTable;
MethodShadowSymbol *next;
ConvertibleArray<MethodSymbol *> *conflict;
bool Find(MethodSymbol *conflict_symbol)
{
if (! conflict)
conflict = new ConvertibleArray<MethodSymbol *>(4);
for (int k = 0; k < conflict -> Length(); k++)
if ((*conflict)[k] == conflict_symbol)
return true;
return false;
}
};
class TypeShadowSymbol
{
public:
TypeSymbol *type_symbol;
TypeShadowSymbol(TypeSymbol *type_symbol_) : type_symbol(type_symbol_),
conflict(NULL)
{}
~TypeShadowSymbol()
{
delete conflict;
}
TypeSymbol *Conflict(int i) { return (*conflict)[i]; }
inline int NumConflicts()
{
return (conflict ? conflict -> Length() : 0);
}
inline void AddConflict(TypeSymbol *conflict_symbol)
{
if ((type_symbol != conflict_symbol) && (! Find(conflict_symbol)))
conflict -> Next() = conflict_symbol;
return;
}
inline void CompressSpace()
{
if (conflict)
(void) conflict -> Array();
}
private:
friend class ExpandedTypeTable;
TypeShadowSymbol *next;
ConvertibleArray<TypeSymbol *> *conflict;
bool Find(TypeSymbol *conflict_symbol)
{
if (! conflict)
conflict = new ConvertibleArray<TypeSymbol *>(4);
for (int k = 0; k < conflict -> Length(); k++)
if ((*conflict)[k] == conflict_symbol)
return true;
return false;
}
};
class ExpandedTypeTable
{
public:
enum
{
DEFAULT_HASH_SIZE = 251,
MAX_HASH_SIZE = 509
};
ConvertibleArray<TypeShadowSymbol *> symbol_pool;
inline void CompressSpace()
{
hash_size = symbol_pool.Length();
hash_size = (hash_size <= 0 ? 1 : (hash_size > MAX_HASH_SIZE ? MAX_HASH_SIZE : hash_size));
delete [] base;
base = (TypeShadowSymbol **) memset(new TypeShadowSymbol *[hash_size], 0, hash_size * sizeof(TypeShadowSymbol *));
TypeShadowSymbol **array = symbol_pool.Array();
for (int i = 0; i < symbol_pool.Length(); i++)
{
array[i] -> CompressSpace();
int k = array[i] -> type_symbol -> name_symbol -> index % hash_size;
array[i] -> next = base[k];
base[k] = array[i];
}
}
ExpandedTypeTable(int hash_size_ = DEFAULT_HASH_SIZE) : symbol_pool(10, 4)
{
hash_size = (hash_size_ <= 0 ? 1 : (hash_size_ > MAX_HASH_SIZE ? MAX_HASH_SIZE : hash_size_));
base = (TypeShadowSymbol **) memset(new TypeShadowSymbol *[hash_size], 0, hash_size * sizeof(TypeShadowSymbol *));
}
~ExpandedTypeTable()
{
for (int k = 0; k < symbol_pool.Length(); k++)
delete symbol_pool[k];
delete [] base;
}
inline TypeShadowSymbol *InsertTypeShadowSymbol(TypeSymbol *type_symbol)
{
int i = type_symbol -> name_symbol -> index % hash_size;
TypeShadowSymbol *p = new TypeShadowSymbol(type_symbol);
p -> next = base[i];
base[i] = p;
symbol_pool.Next() = p;
return p;
}
inline TypeShadowSymbol *FindTypeShadowSymbol(NameSymbol *name_symbol)
{
TypeShadowSymbol *p;
for (p = base[name_symbol -> index % hash_size]; p; p = p -> next)
if (p -> type_symbol -> name_symbol == name_symbol)
break;
return p;
}
private:
TypeShadowSymbol **base;
int hash_size;
};
class ExpandedFieldTable
{
public:
enum
{
DEFAULT_HASH_SIZE = 251,
MAX_HASH_SIZE = 509
};
ConvertibleArray<VariableShadowSymbol *> symbol_pool;
inline void CompressSpace()
{
hash_size = symbol_pool.Length();
hash_size = (hash_size <= 0 ? 1 : (hash_size > MAX_HASH_SIZE ? MAX_HASH_SIZE : hash_size));
delete [] base;
base = (VariableShadowSymbol **) memset(new VariableShadowSymbol *[hash_size], 0, hash_size * sizeof(VariableShadowSymbol *));
VariableShadowSymbol **array = symbol_pool.Array();
for (int i = 0; i < symbol_pool.Length(); i++)
{
array[i] -> CompressSpace();
int k = array[i] -> variable_symbol -> name_symbol -> index % hash_size;
array[i] -> next = base[k];
base[k] = array[i];
}
}
ExpandedFieldTable(int hash_size_ = DEFAULT_HASH_SIZE) : symbol_pool(10, 4)
{
hash_size = (hash_size_ <= 0 ? 1 : (hash_size_ > MAX_HASH_SIZE ? MAX_HASH_SIZE : hash_size_));
base = (VariableShadowSymbol **) memset(new VariableShadowSymbol *[hash_size], 0, hash_size * sizeof(VariableShadowSymbol *));
}
~ExpandedFieldTable()
{
for (int i = 0; i < symbol_pool.Length(); i++)
delete symbol_pool[i];
delete [] base;
}
inline VariableShadowSymbol *InsertVariableShadowSymbol(VariableSymbol *variable_symbol)
{
int i = variable_symbol -> name_symbol -> index % hash_size;
VariableShadowSymbol *p = new VariableShadowSymbol(variable_symbol);
p -> next = base[i];
base[i] = p;
symbol_pool.Next() = p;
return p;
}
inline VariableShadowSymbol *FindVariableShadowSymbol(NameSymbol *name_symbol)
{
VariableShadowSymbol *p;
for (p = base[name_symbol -> index % hash_size]; p; p = p -> next)
if (p -> variable_symbol -> name_symbol == name_symbol)
break;
return p;
}
private:
VariableShadowSymbol **base;
int hash_size;
};
class ExpandedMethodTable
{
public:
enum
{
DEFAULT_HASH_SIZE = 251,
MAX_HASH_SIZE = 509
};
ConvertibleArray<MethodShadowSymbol *> symbol_pool;
inline void CompressSpace()
{
hash_size = symbol_pool.Length();
hash_size = (hash_size <= 0 ? 1 : (hash_size > MAX_HASH_SIZE ? MAX_HASH_SIZE : hash_size));
delete [] base;
base = (MethodShadowSymbol **) memset(new MethodShadowSymbol *[hash_size], 0, hash_size * sizeof(MethodShadowSymbol *));
MethodShadowSymbol **array = symbol_pool.Array();
for (int i = 0; i < symbol_pool.Length(); i++)
{
array[i] -> CompressSpace();
NameSymbol *name_symbol = array[i] -> method_symbol -> name_symbol;
MethodShadowSymbol *base_shadow = FindMethodShadowSymbol(name_symbol);
if (! base_shadow)
{
int k = name_symbol -> index % hash_size;
array[i] -> next = base[k];
base[k] = array[i];
array[i] -> next_method = NULL;
}
else
{
array[i] -> next_method = base_shadow -> next_method;
base_shadow -> next_method = array[i];
}
}
}
ExpandedMethodTable(int hash_size_ = DEFAULT_HASH_SIZE) : symbol_pool(10, 4)
{
hash_size = (hash_size_ <= 0 ? 1 : (hash_size_ > MAX_HASH_SIZE ? MAX_HASH_SIZE : hash_size_));
base = (MethodShadowSymbol **) memset(new MethodShadowSymbol *[hash_size], 0, hash_size * sizeof(MethodShadowSymbol *));
}
~ExpandedMethodTable()
{
for (int i = 0; i < symbol_pool.Length(); i++)
delete symbol_pool[i];
delete [] base;
}
inline MethodShadowSymbol *FindMethodShadowSymbol(NameSymbol *name_symbol)
{
MethodShadowSymbol *p;
for (p = base[name_symbol -> index % hash_size]; p; p = p -> next)
if (p -> method_symbol -> name_symbol == name_symbol)
break;
return p;
}
inline void InsertMethodShadowSymbol(MethodSymbol *method_symbol)
{
int i = method_symbol -> name_symbol -> index % hash_size;
MethodShadowSymbol *p = new MethodShadowSymbol(method_symbol);
p -> next_method = NULL;
p -> next = base[i];
base[i] = p;
symbol_pool.Next() = p;
return;
}
inline void Overload(MethodShadowSymbol *base_shadow, MethodSymbol *overload_method)
{
MethodShadowSymbol *shadow = new MethodShadowSymbol(overload_method);
symbol_pool.Next() = shadow;
shadow -> next_method = base_shadow -> next_method;
base_shadow -> next_method = shadow;
}
inline void Overload(MethodSymbol *overload_method)
{
MethodShadowSymbol *base_shadow = FindMethodShadowSymbol(overload_method -> name_symbol);
if (! base_shadow)
InsertMethodShadowSymbol(overload_method);
else Overload(base_shadow, overload_method);
}
MethodShadowSymbol *FindOverloadMethodShadow(MethodSymbol *overload_method, Semantic *sem, LexStream::TokenIndex tok)
{
if (! overload_method -> IsTyped())
overload_method -> ProcessMethodSignature(sem, tok);
for (MethodShadowSymbol *method_shadow = FindMethodShadowSymbol(overload_method -> name_symbol);
method_shadow;
method_shadow = method_shadow -> next_method)
{
MethodSymbol *method = method_shadow -> method_symbol;
if (overload_method == method)
return method_shadow;
if (! method -> IsTyped())
method -> ProcessMethodSignature(sem, tok);
if (overload_method -> NumFormalParameters() == method -> NumFormalParameters())
{
int i;
for (i = method -> NumFormalParameters() - 1; i >= 0; i--)
{
if (method -> FormalParameter(i) -> Type() != overload_method -> FormalParameter(i) -> Type())
break;
}
if (i < 0)
return method_shadow;
}
}
return (MethodShadowSymbol *) NULL;
}
private:
MethodShadowSymbol **base;
int hash_size;
};
#endif